/*
 * 如果你想访问网站的租户级设置，可以使用 Site Settings。
 * 这些设置作为单例对象存储在 ISite 对象中。
 * 访问这些设置需通过 ISiteService 服务。
 * 本示例还演示如何添加与模块功能相关的自定义站点设置对象。
 */

using Ruitu.Edu.TrainingDemo.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using OrchardCore.Settings;
using System.Threading.Tasks;

namespace Ruitu.Edu.TrainingDemo.Controllers;

/// <summary>
/// 站点设置控制器 - 演示如何访问和使用 Orchard Core 站点设置
/// 
/// 主要用途：
/// - 访问租户级别的站点设置
/// - 演示自定义站点设置的读取方式
/// 
/// 使用场景：
/// - 需要读取或展示站点基础信息
/// - 需要访问自定义模块相关设置
/// 
/// 设计原因：
/// - 利用 ISiteService 统一管理站点设置
/// - 支持自定义设置对象的序列化与读取
/// 
/// 设计模式：
/// - 依赖注入模式：通过构造函数注入站点服务和选项
/// </summary>
public sealed class SiteSettingsController : Controller
{
    private readonly ISiteService _siteService;
    private readonly DemoSettings _demoSettings;

    /// <summary>
    /// 构造函数 - 注入站点服务和演示设置
    /// </summary>
    public SiteSettingsController(ISiteService siteService, IOptionsSnapshot<DemoSettings> demoOptions)
    {
        _siteService = siteService;
        _demoSettings = demoOptions.Value;
    }

    /// <summary>
    /// 获取站点名称
    /// 访问路径：/Ruitu.Edu.TrainingDemo/SiteSettings/SiteName
    /// </summary>
    public async Task<string> SiteName() =>
        (await _siteService.GetSiteSettingsAsync()).SiteName;

    // 下一站：Models/DemoSettings.cs

    /// <summary>
    /// 读取自定义站点设置演示
    /// 访问路径：/Ruitu.Edu.TrainingDemo/SiteSettings/DemoSettings
    /// </summary>
    public async Task<string> DemoSettings()
    {
        // 通过 ISiteService 获取自定义设置对象。
        var messageFromSiteSettings = (await _siteService.GetSettingsAsync<DemoSettings>()).Message;
        // 通过 IOptionsSnapshot 获取设置对象。
        var messageFromOptions = _demoSettings.Message;
        // IOptionsSnapshot 始终获取最新设置，IOptions 可用于缓存设置。
        return $"Message from site settings: \"{messageFromSiteSettings}\". From options: \"{messageFromOptions}\"";
    }
}

// 训练部分结束：站点设置与 IConfiguration
// 下一站：Filters/ShapeInjectionFilter.cs
